package com.sjz.myfrist;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/***
 * 文件存储
 * 共同特点：
 * 存入数据，读取数据时使用IO流进行的操作
 * 内部存储
 * 1.  存储位置固定：data/data/程序包名/files   FilePersistenceTest存储的是内部存储
 * 2.  存储的文件类型可任意指定
 * 3.  存储的数据类型不固定，可以存储任意的图片，文字等数据
 *外部存储
 * 1.  存储位置部分固定：手机的外部存储卡，sd卡中， 默认的sd路径： /mnt/sdcard
 * 2.  存储的文件类型可任意指定
 * 3.  存储的数据类型不固定，可以存储任意的图片，文字等数据
 */
public class FilePersistenceTest extends AppCompatActivity {
    private EditText edit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.file_persistence_test);

        edit = (EditText) findViewById(R.id.file_persistence_edit);
        Button save = (Button)findViewById(R.id.file_persistence_save);
        Button load = (Button)findViewById(R.id.file_persistence_load);

        //点击保存数据
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = edit.getText().toString();
                save(inputText);
            }
        });

        //点击加载数据
        load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = load();
                if (!TextUtils.isEmpty(inputText)) {
                    edit.setText(inputText);
                    edit.setSelection(inputText.length());
                    Toast.makeText(FilePersistenceTest.this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    /***
     * 重写了onDestroy()方法，这样可以保证活动在销毁之前一定调用这个方法，
     * 并且在onDestroy()方法里获取EditText输入的内容，并调用save()方法把输入的内容存储到文件中，
     * 文件命名为data，而save方法中就是java中写文件的操作。
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputText = edit.getText().toString();
        save(inputText);
    }

    /****
     * 保存数据
     * Context类提供了一个openFileOutput()方法，可以将数据存储到指定的文件中，这个方法有两个参数，第一个参数是文件名，注意不可以包含路径；
     * 第二个参数是文件的操作模式，MODE_PRIVATE是默认。表示当指定同样文件名的时候，会覆盖原文件内容。
     *data 文件名
     */
    public void save(String inputText) {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /***
     * 思路：load()方法用来读取文件中存储的文本内容，如果不为null，则调用EditText的setText()方法将内容填充到EditText里，
     * 并调用setSelection()方法将输入光标移动到文本的末尾位置便于继续输入。
       TextUtils.isEmpty()方法可以一次性进行两种空值的判断，当传入的字符串等于null或等于空字符串的时候，返回true。
     * @return
     */
    public String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }
}